Защита памяти

Редактировал(а) Роман Воробьев 2021/08/02 03:06

Защита памяти реализована с использованием механизмов PaX.

Главная особенность состоит в реализации механизма MPROTECT, который блокирует одновременный доступ к памяти на запись и исполнение (W^X).

Данный механизм может блокировать работу некоторого ПО. В случае необходимости, он может быть выборочно или полностью отключен.

Для полного отключения MPROTECT необходимо добавить в командную строку ядра параметр mprotect=off.

  • Для отключения до перезагрузки добавить mprotect=off в командной строке ядра в grub, работает для всех ядер кроме hardened.
  • Для постоянного отключения в конфигурационном файле /etc/default/grubс дописать в строку GRUB_CMDLINE_LINUX_DEFAULT="quiet mprotect=off" с последующим вызовомsudo update-grub, работает для всех ядер кроме hardened.

Для выборочного отключения используется утилита paxrat, ее конфигурация находится в файле /etc/paxrat/paxrat.conf, и во всех файлах каталога /etc/paxrat/conf.d/ (предпочтительно настройки сохранять в отдельных файлах). Утилита проставляет флаги исключений в расширенные атрибуты исполняемых файлов. Утилита запускается автоматически при установке новых пакетов, но может быть вызвана и вручную командой sudo paxrat.

Возможна и ручная установка флагов в расширенные атрибуты файла командой setfattr -n user.pax.flags -v m <filename>.

Дополнительно, возможно управление флагами и политикой PaX через модуль безопасности NESS (пример).

На ядре hardened дополнительно реализован механизм RANDMMAP, увеличивающий рандомизацию адресного пространства.

Все версии ядер ОСновы (не только hardened) в конфигурации по умолчанию проходят тест paxtest.

$ sudo paxtest blackhat
PaXtest - Copyright(c) 2003-2014 by Peter Busser <peter@adamantix.org> and Brad Spengler <spender@grsecurity.net>
Released under the GNU Public Licence version 2 or later

Writing output to paxtest.log
It may take a while for the tests to complete
Test results:
PaXtest - Copyright(c) 2003-2014 by Peter Busser <peter@adamantix.org> and Brad Spengler <spender@grsecurity.net>
Released under the GNU Public Licence version 2 or later

Mode: 1
Blackhat
Kernel:
Linux onyx2 5.4.0-0.bpo.4.2-amd64 #1 SMP Debian 5.4.66-1~bpo10+1.osnova144 (2020-11-17) x86_64 GNU/Linux

Relase information:
Distributor ID:    Osnova
Description:    OSNova Linux (Onyx 2.0)
Release:    2.0
Codename:    onyx
Test results:
Executable anonymous mapping             : Killed
Executable bss                           : Killed
Executable data                          : Killed
Executable heap                          : Killed
Executable stack                         : Killed
Executable shared library bss            : Killed
Executable shared library data           : Killed
Executable anonymous mapping (mprotect)  : Killed
Executable bss (mprotect)                : Killed
Executable data (mprotect)               : Killed
Executable heap (mprotect)               : Killed
Executable stack (mprotect)              : Killed
Executable shared library bss (mprotect) : Killed
Executable shared library data (mprotect): Killed
Writable text segments                   : Killed
Anonymous mapping randomization test     : 32 quality bits (guessed)
Heap randomization test (ET_EXEC)        : 32 quality bits (guessed)
Heap randomization test (PIE)            : 32 quality bits (guessed)
Main executable randomization (ET_EXEC)  : 32 quality bits (guessed)
Main executable randomization (PIE)      : 32 quality bits (guessed)
Shared library randomization test        : 32 quality bits (guessed)
VDSO randomization test                  : 20 quality bits (guessed)
Stack randomization test (SEGMEXEC)      : 30 quality bits (guessed)
Stack randomization test (PAGEEXEC)      : 30 quality bits (guessed)
Arg/env randomization test (SEGMEXEC)    : 22 quality bits (guessed)
Arg/env randomization test (PAGEEXEC)    : 22 quality bits (guessed)
Randomization under memory exhaustion @~0: 32 bits (guessed)
Randomization under memory exhaustion @0 : 32 bits (guessed)
Return to function (strcpy)              : paxtest: return address contains a NULL byte.
Return to function (memcpy)              : Killed
Return to function (strcpy, PIE)         : paxtest: return address contains a NULL byte.
Return to function (memcpy, PIE)         : Killed